package custom;

import com.alibaba.fastjson.JSON;
import entity.MessageData;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.extern.slf4j.Slf4j;

/**
 * @author:Eric
 * @date:2021/8/4 11:10
 * 自定义编码器
 * * <p>
 * +---------------------------------------------------------------+
 * | 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte  |
 * +---------------------------------------------------------------+
 * | 状态 1byte |        保留字段 4byte     |      数据长度 4byte     | 
 * +---------------------------------------------------------------+
 * |                   数据内容 （长度不定）                          |
 * +---------------------------------------------------------------+
 */
@Slf4j
public class CustomEncoder extends MessageToByteEncoder {
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) {

        if (msg instanceof MessageData) {
            log.info("数据编码……");
            byte[] bytes = JSON.toJSONString(msg).getBytes();
            //魔数,参数代表ASCII码值
            out.writeChar(97);
            //版本号
            out.writeByte(1);
            //序列化算法
            out.writeByte(5);
            //报文类型
            out.writeByte(2);
            //状态
            out.writeByte(3);
            //保留字段
            out.writeInt(100);
            //数据长度
            out.writeInt(bytes.length);
            //数据
            out.writeBytes(bytes);
        }
    }
}
